home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 60 / IOPROG_60.ISO / soft / c++ / gsl-1.1.1-setup.exe / {app} / src / specfunc / airy_der.c next >
Encoding:
C/C++ Source or Header  |  2002-04-18  |  23.9 KB  |  889 lines

  1. /* specfunc/airy_der.c
  2.  * 
  3.  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or (at
  8.  * your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. /* Author:  G. Jungman */
  21.  
  22. #include <config.h>
  23. #include <gsl/gsl_math.h>
  24. #include <gsl/gsl_errno.h>
  25. #include <gsl/gsl_sf_exp.h>
  26. #include <gsl/gsl_sf_airy.h>
  27.  
  28. #include "error.h"
  29.  
  30. #include "chebyshev.h"
  31. #include "cheb_eval_mode.c"
  32.  
  33. /*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
  34.  
  35.  
  36. /* based on SLATEC aide.f, bide.f, aid.f, bid.f, r9admp.f */
  37.  
  38. /* 
  39.  series for aif on the interval -1.00000e+00 to  1.00000e+00
  40.                     with weighted error   5.22e-18
  41.                      log weighted error  17.28
  42.                    significant figures required  16.01
  43.                     decimal places required  17.73
  44. */
  45. static double aif_data[8] = {
  46.    0.10527461226531408809,
  47.    0.01183613628152997844,
  48.    0.00012328104173225664,
  49.    0.00000062261225638140,
  50.    0.00000000185298887844,
  51.    0.00000000000363328873,
  52.    0.00000000000000504622,
  53.    0.00000000000000000522
  54. };
  55. static cheb_series aif_cs = {
  56.   aif_data,
  57.   7,
  58.   -1, 1,
  59.   7
  60. };
  61.  
  62. /*
  63.  series for aig on the interval -1.00000e+00 to  1.00000e+00
  64.                     with weighted error   3.14e-19
  65.                      log weighted error  18.50
  66.                    significant figures required  17.44
  67.                     decimal places required  18.98
  68. */
  69. static double aig_data[9] = {
  70.    0.021233878150918666852,
  71.    0.086315930335214406752,
  72.    0.001797594720383231358,
  73.    0.000014265499875550693,
  74.    0.000000059437995283683,
  75.    0.000000000152403366479,
  76.    0.000000000000264587660,
  77.    0.000000000000000331562,
  78.    0.000000000000000000314
  79. };
  80. static cheb_series aig_cs = {
  81.   aig_data,
  82.   8,
  83.   -1, 1,
  84.   8
  85. };
  86.  
  87. /*
  88.  series for aip2 on the interval  0.00000e+00 to  1.25000e-01
  89.                     with weighted error   2.15e-17
  90.                      log weighted error  16.67
  91.                    significant figures required  14.27
  92.                     decimal places required  17.26
  93. */
  94. static double aip2_data[15] = {
  95.     0.0065457691989713757,
  96.     0.0023833724120774592,
  97.    -0.0000430700770220586,
  98.     0.0000015629125858629,
  99.    -0.0000000815417186163,
  100.     0.0000000054103738057,
  101.    -0.0000000004284130883,
  102.     0.0000000000389497963,
  103.    -0.0000000000039623161,
  104.     0.0000000000004428184,
  105.    -0.0000000000000536297,
  106.     0.0000000000000069650,
  107.    -0.0000000000000009620,
  108.     0.0000000000000001403,
  109.    -0.0000000000000000215
  110. };
  111. static cheb_series aip2_cs = {
  112.   aip2_data,
  113.   14,
  114.   -1, 1,
  115.   9
  116. };
  117.  
  118. /*
  119.  series for aip1 on the interval  1.25000e-01 to  1.00000e+00
  120.                     with weighted error   2.60e-17
  121.                      log weighted error  16.58
  122.                    significant figures required  14.91
  123.                     decimal places required  17.28
  124. */
  125. static double aip1_data[25] = {
  126.     0.0358865097808301538,
  127.     0.0114668575627764899,
  128.    -0.0007592073583861400,
  129.     0.0000869517610893841,
  130.    -0.0000128237294298592,
  131.     0.0000022062695681038,
  132.    -0.0000004222295185921,
  133.     0.0000000874686415726,
  134.    -0.0000000192773588418,
  135.     0.0000000044668460054,
  136.    -0.0000000010790108052,
  137.     0.0000000002700029447,
  138.    -0.0000000000696480108,
  139.     0.0000000000184489907,
  140.    -0.0000000000050027817,
  141.     0.0000000000013852243,
  142.    -0.0000000000003908218,
  143.     0.0000000000001121536,
  144.    -0.0000000000000326862,
  145.     0.0000000000000096619,
  146.    -0.0000000000000028935,
  147.     0.0000000000000008770,
  148.    -0.0000000000000002688,
  149.     0.0000000000000000832,
  150.    -0.0000000000000000260
  151. };
  152. static cheb_series aip1_cs = {
  153.   aip1_data,
  154.   24,
  155.   -1, 1,
  156.   14
  157. };
  158.  
  159.  
  160. /*
  161.  series for bif on the interval -1.00000e+00 to  1.00000e+00
  162.                     with weighted error   9.05e-18
  163.                      log weighted error  17.04
  164.                    significant figures required  15.83
  165.                     decimal places required  17.49
  166. */
  167. static double bif_data[8] = {
  168.    0.1153536790828570243,
  169.    0.0205007894049192875,
  170.    0.0002135290278902876,
  171.    0.0000010783960614677,
  172.    0.0000000032094708833,
  173.    0.0000000000062930407,
  174.    0.0000000000000087403,
  175.    0.0000000000000000090
  176. };
  177. static cheb_series bif_cs = {
  178.   bif_data,
  179.   7,
  180.   -1, 1,
  181.   7
  182. };
  183.  
  184. /*
  185.  series for big on the interval -1.00000e+00 to  1.00000e+00
  186.                     with weighted error   5.44e-19
  187.                      log weighted error  18.26
  188.                    significant figures required  17.46
  189.                     decimal places required  18.74
  190. */
  191. static double big_data[9] = {
  192.    -0.097196440416443537390,
  193.     0.149503576843167066571,
  194.     0.003113525387121326042,
  195.     0.000024708570579821297,
  196.     0.000000102949627731379,
  197.     0.000000000263970373987,
  198.     0.000000000000458279271,
  199.     0.000000000000000574283,
  200.     0.000000000000000000544
  201. };
  202. static cheb_series big_cs = {
  203.   big_data,
  204.   8,
  205.   -1, 1,
  206.   8
  207. };
  208.  
  209. /*
  210.  series for bif2 on the interval  1.00000e+00 to  8.00000e+00
  211.                     with weighted error   3.82e-19
  212.                      log weighted error  18.42
  213.                    significant figures required  17.68
  214.                     decimal places required  18.92
  215. */
  216. static double bif2_data[10] = {
  217.    0.323493987603522033521,
  218.    0.086297871535563559139,
  219.    0.002994025552655397426,
  220.    0.000051430528364661637,
  221.    0.000000525840250036811,
  222.    0.000000003561751373958,
  223.    0.000000000017146864007,
  224.    0.000000000000061663520,
  225.    0.000000000000000171911,
  226.    0.000000000000000000382
  227. };
  228. static cheb_series bif2_cs = {
  229.   bif2_data,
  230.   9,
  231.   -1, 1,
  232.   9
  233. };
  234.  
  235. /*
  236.  series for big2 on the interval  1.00000e+00 to  8.00000e+00
  237.                     with weighted error   3.35e-17
  238.                      log weighted error  16.48
  239.                    significant figures required  16.52
  240.                     decimal places required  16.98
  241. */
  242. static double big2_data[10] = {
  243.    1.6062999463621294578,
  244.    0.7449088819876088652,
  245.    0.0470138738610277380,
  246.    0.0012284422062548239,
  247.    0.0000173222412256624,
  248.    0.0000001521901652368,
  249.    0.0000000009113560249,
  250.    0.0000000000039547918,
  251.    0.0000000000000130017,
  252.    0.0000000000000000335
  253. };
  254. static cheb_series big2_cs = {
  255.   big2_data,
  256.   9,
  257.   -1, 1,
  258.   9
  259. };
  260.  
  261. /*
  262.  series for bip2 on the interval  0.00000e+00 to  1.25000e-01
  263.                     with weighted error   2.07e-18
  264.                      log weighted error  17.69
  265.                    significant figures required  16.51
  266.                     decimal places required  18.42
  267. */
  268. static double bip2_data[29] = {
  269.     -0.13269705443526630495,
  270.     -0.00568443626045977481,
  271.     -0.00015643601119611610,
  272.     -0.00001136737203679562,
  273.     -0.00000143464350991284,
  274.     -0.00000018098531185164,
  275.      0.00000000926177343611,
  276.      0.00000001710005490721,
  277.      0.00000000476698163504,
  278.     -0.00000000035195022023,
  279.     -0.00000000058890614316,
  280.     -0.00000000006678499608,
  281.      0.00000000006395565102,
  282.      0.00000000001554529427,
  283.     -0.00000000000792397000,
  284.     -0.00000000000258326243,
  285.      0.00000000000121655048,
  286.      0.00000000000038707207,
  287.     -0.00000000000022487045,
  288.     -0.00000000000004953477,
  289.      0.00000000000004563782,
  290.      0.00000000000000332998,
  291.     -0.00000000000000921750,
  292.      0.00000000000000094157,
  293.      0.00000000000000167154,
  294.     -0.00000000000000055134,
  295.     -0.00000000000000022369,
  296.      0.00000000000000017487,
  297.      0.00000000000000000207
  298. };
  299. static cheb_series bip2_cs = {
  300.   bip2_data,
  301.   28,
  302.   -1, 1,
  303.   14
  304. };
  305.  
  306. /*
  307.  series for bip1 on the interval  1.25000e-01 to  3.53553e-01
  308.                     with weighted error   1.86e-17
  309.                      log weighted error  16.73
  310.                    significant figures required  15.67
  311.                     decimal places required  17.42
  312. */
  313. static double bip1_data[24] = {
  314.    -0.1729187351079553719,
  315.    -0.0149358492984694364,
  316.    -0.0005471104951678566,
  317.     0.0001537966292958408,
  318.     0.0000154353476192179,
  319.    -0.0000065434113851906,
  320.     0.0000003728082407879,
  321.     0.0000002072078388189,
  322.    -0.0000000658173336470,
  323.     0.0000000074926746354,
  324.     0.0000000011101336884,
  325.    -0.0000000007265140553,
  326.     0.0000000001782723560,
  327.    -0.0000000000217346352,
  328.    -0.0000000000020302035,
  329.     0.0000000000019311827,
  330.    -0.0000000000006044953,
  331.     0.0000000000001209450,
  332.    -0.0000000000000125109,
  333.    -0.0000000000000019917,
  334.     0.0000000000000015154,
  335.    -0.0000000000000004977,
  336.     0.0000000000000001155,
  337.    -0.0000000000000000186
  338. };
  339. static cheb_series bip1_cs = {
  340.   bip1_data,
  341.   23,
  342.   -1, 1,
  343.   13
  344. };
  345.  
  346. /*
  347.  series for an22 on the interval -1.00000e+00 to -1.25000e-01
  348.                     with weighted error   3.30e-17
  349.                      log weighted error  16.48
  350.                    significant figures required  14.95
  351.                     decimal places required  17.24
  352. */
  353. static double an22_data[33] = {
  354.     0.0537418629629794329,
  355.    -0.0126661435859883193,
  356.    -0.0011924334106593007,
  357.    -0.0002032327627275655,
  358.    -0.0000446468963075164,
  359.    -0.0000113359036053123,
  360.    -0.0000031641352378546,
  361.    -0.0000009446708886149,
  362.    -0.0000002966562236472,
  363.    -0.0000000969118892024,
  364.    -0.0000000326822538653,
  365.    -0.0000000113144618964,
  366.    -0.0000000040042691002,
  367.    -0.0000000014440333684,
  368.    -0.0000000005292853746,
  369.    -0.0000000001967763374,
  370.    -0.0000000000740800096,
  371.    -0.0000000000282016314,
  372.    -0.0000000000108440066,
  373.    -0.0000000000042074801,
  374.    -0.0000000000016459150,
  375.    -0.0000000000006486827,
  376.    -0.0000000000002574095,
  377.    -0.0000000000001027889,
  378.    -0.0000000000000412846,
  379.    -0.0000000000000166711,
  380.    -0.0000000000000067657,
  381.    -0.0000000000000027585,
  382.    -0.0000000000000011296,
  383.    -0.0000000000000004645,
  384.    -0.0000000000000001917,
  385.    -0.0000000000000000794,
  386.    -0.0000000000000000330
  387. };
  388. static cheb_series an22_cs = {
  389.   an22_data,
  390.   32,
  391.   -1, 1,
  392.   18
  393. };
  394.  
  395. /*
  396.  series for an21 on the interval -1.25000e-01 to -1.56250e-02
  397.                     with weighted error   3.43e-17
  398.                      log weighted error  16.47
  399.                    significant figures required  14.48
  400.                     decimal places required  17.16
  401. */
  402. static double an21_data[24] = {
  403.     0.0198313155263169394,
  404.    -0.0029376249067087533,
  405.    -0.0001136260695958196,
  406.    -0.0000100554451087156,
  407.    -0.0000013048787116563,
  408.    -0.0000002123881993151,
  409.    -0.0000000402270833384,
  410.    -0.0000000084996745953,
  411.    -0.0000000019514839426,
  412.    -0.0000000004783865344,
  413.    -0.0000000001236733992,
  414.    -0.0000000000334137486,
  415.    -0.0000000000093702824,
  416.    -0.0000000000027130128,
  417.    -0.0000000000008075954,
  418.    -0.0000000000002463214,
  419.    -0.0000000000000767656,
  420.    -0.0000000000000243883,
  421.    -0.0000000000000078831,
  422.    -0.0000000000000025882,
  423.    -0.0000000000000008619,
  424.    -0.0000000000000002908,
  425.    -0.0000000000000000993,
  426.    -0.0000000000000000343
  427. };
  428. static cheb_series an21_cs = {
  429.   an21_data,
  430.   23,
  431.   -1, 1,
  432.   12
  433. };
  434.  
  435. /*
  436.  series for an20 on the interval -1.56250e-02 to  0.00000e+00
  437.                     with weighted error   4.41e-17
  438.                      log weighted error  16.36
  439.                    significant figures required  14.16
  440.                     decimal places required  16.96
  441. */
  442. static double an20_data[16] = {
  443.     0.0126732217145738027,
  444.    -0.0005212847072615621,
  445.    -0.0000052672111140370,
  446.    -0.0000001628202185026,
  447.    -0.0000000090991442687,
  448.    -0.0000000007438647126,
  449.    -0.0000000000795494752,
  450.    -0.0000000000104050944,
  451.    -0.0000000000015932426,
  452.    -0.0000000000002770648,
  453.    -0.0000000000000535343,
  454.    -0.0000000000000113062,
  455.    -0.0000000000000025772,
  456.    -0.0000000000000006278,
  457.    -0.0000000000000001621,
  458.    -0.0000000000000000441
  459. };
  460. static cheb_series an20_cs = {
  461.   an20_data,
  462.   15,
  463.   -1, 1,
  464.   8
  465. };
  466.  
  467. /*
  468.  series for aph2 on the interval -1.00000e+00 to -1.25000e-01
  469.                     with weighted error   2.94e-17
  470.                      log weighted error  16.53
  471.                    significant figures required  15.58
  472.                     decimal places required  17.28
  473. */
  474. static double aph2_data[32] = {
  475.    -0.2057088719781465107,
  476.     0.0422196961357771922,
  477.     0.0020482560511207275,
  478.     0.0002607800735165006,
  479.     0.0000474824268004729,
  480.     0.0000105102756431612,
  481.     0.0000026353534014668,
  482.     0.0000007208824863499,
  483.     0.0000002103236664473,
  484.     0.0000000644975634555,
  485.     0.0000000205802377264,
  486.     0.0000000067836273921,
  487.     0.0000000022974015284,
  488.     0.0000000007961306765,
  489.     0.0000000002813860610,
  490.     0.0000000001011749057,
  491.     0.0000000000369306738,
  492.     0.0000000000136615066,
  493.     0.0000000000051142751,
  494.     0.0000000000019351689,
  495.     0.0000000000007393607,
  496.     0.0000000000002849792,
  497.     0.0000000000001107281,
  498.     0.0000000000000433412,
  499.     0.0000000000000170801,
  500.     0.0000000000000067733,
  501.     0.0000000000000027017,
  502.     0.0000000000000010835,
  503.     0.0000000000000004367,
  504.     0.0000000000000001769,
  505.     0.0000000000000000719,
  506.     0.0000000000000000294
  507. };
  508. static cheb_series aph2_cs = {
  509.   aph2_data,
  510.   31,
  511.   -1, 1,
  512.   16
  513. };
  514.  
  515. /*
  516.  series for aph1 on the interval -1.25000e-01 to -1.56250e-02
  517.                     with weighted error   6.38e-17
  518.                      log weighted error  16.20
  519.                    significant figures required  14.91
  520.                     decimal places required  16.87
  521. */
  522. static double aph1_data[22] = {
  523.   -0.1024172908077571694,
  524.    0.0071697275146591248,
  525.    0.0001209959363122329,
  526.    0.0000073361512841220,
  527.    0.0000007535382954272,
  528.    0.0000001041478171741,
  529.    0.0000000174358728519,
  530.    0.0000000033399795033,
  531.    0.0000000007073075174,
  532.    0.0000000001619187515,
  533.    0.0000000000394539982,
  534.    0.0000000000101192282,
  535.    0.0000000000027092778,
  536.    0.0000000000007523806,
  537.    0.0000000000002156369,
  538.    0.0000000000000635283,
  539.    0.0000000000000191757,
  540.    0.0000000000000059143,
  541.    0.0000000000000018597,
  542.    0.0000000000000005950,
  543.    0.0000000000000001934,
  544.    0.0000000000000000638
  545. };
  546. static cheb_series aph1_cs = {
  547.   aph1_data,
  548.   21,
  549.   -1, 1,
  550.   10
  551. };
  552.  
  553. /*
  554.  series for aph0 on the interval -1.56250e-02 to  0.00000e+00
  555.                     with weighted error   2.29e-17
  556.                      log weighted error  16.64
  557.                    significant figures required  15.27
  558.                     decimal places required  17.23
  559. */
  560. static double aph0_data[15] = {
  561.  -0.0855849241130933257,
  562.   0.0011214378867065261,
  563.   0.0000042721029353664,
  564.   0.0000000817607381483,
  565.   0.0000000033907645000,
  566.   0.0000000002253264423,
  567.   0.0000000000206284209,
  568.   0.0000000000023858763,
  569.   0.0000000000003301618,
  570.   0.0000000000000527010,
  571.   0.0000000000000094555,
  572.   0.0000000000000018709,
  573.   0.0000000000000004024,
  574.   0.0000000000000000930,
  575.   0.0000000000000000229
  576. };
  577. static cheb_series aph0_cs = {
  578.   aph0_data,
  579.   14,
  580.   -1, 1,
  581.   7
  582. };
  583.  
  584.  
  585. static
  586. int
  587. airy_deriv_mod_phase(const double x, gsl_mode_t mode,
  588.                      gsl_sf_result * ampl, gsl_sf_result * phi)
  589. {
  590.   const double pi34 = 2.356194490192344928847;
  591.   gsl_sf_result result_a;
  592.   gsl_sf_result result_p;
  593.   double a, p;
  594.   double sqx;
  595.   double x32;
  596.  
  597.   if(x <= -4.0) {
  598.     double z = 128.0/(x*x*x) + 1.0;
  599.     cheb_eval_mode_e(&an20_cs, z, mode, &result_a);
  600.     cheb_eval_mode_e(&aph0_cs, z, mode, &result_p);
  601.   }
  602.   else if(x <= -2.0) {
  603.     double z = (128.0/(x*x*x) + 9.0) / 7.0;
  604.     cheb_eval_mode_e(&an21_cs, z, mode, &result_a);
  605.     cheb_eval_mode_e(&aph1_cs, z, mode, &result_p);
  606.   }
  607.   else if(x <= -1.0) {
  608.     double z = (16.0/(x*x*x) + 9.0) / 7.0;
  609.     cheb_eval_mode_e(&an22_cs, z, mode, &result_a);
  610.     cheb_eval_mode_e(&aph2_cs, z, mode, &result_p);
  611.   }
  612.   else {
  613.     ampl->val = 0.0;
  614.     ampl->err = 0.0;
  615.     phi->val  = 0.0;
  616.     phi->err  = 0.0;
  617.     GSL_ERROR ("x is greater than 1.0", GSL_EDOM);
  618.   }
  619.  
  620.   a =  0.3125 + result_a.val;
  621.   p = -0.625  + result_p.val;
  622.  
  623.   sqx = sqrt(-x);
  624.   x32   = x*sqx;
  625.  
  626.   ampl->val = sqrt(a * sqx);
  627.   ampl->err = fabs(ampl->val) * (GSL_DBL_EPSILON + fabs(result_a.err/result_a.val));
  628.   phi->val  = pi34 - x * sqx * p;
  629.   phi->err = fabs(phi->val) * (GSL_DBL_EPSILON + fabs(result_p.err/result_p.val));
  630.  
  631.   return GSL_SUCCESS;
  632. }
  633.  
  634.  
  635. /*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
  636.  
  637. int
  638. gsl_sf_airy_Ai_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
  639. {
  640.   /* CHECK_POINTER(result) */
  641.  
  642.   if(x < -1.0) {
  643.     gsl_sf_result a;
  644.     gsl_sf_result p;
  645.     int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
  646.     double c    = cos(p.val);
  647.     result->val  = a.val * c;
  648.     result->err  = fabs(result->val * p.err) + fabs(c * a.err);
  649.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  650.     return status_ap;
  651.   }
  652.   else if(x <= 1.0) {
  653.     const double x3 = x*x*x;
  654.     const double x2 = x*x;
  655.     gsl_sf_result result_c0;
  656.     gsl_sf_result result_c1;
  657.     cheb_eval_mode_e(&aif_cs, x3, mode, &result_c0);
  658.     cheb_eval_mode_e(&aig_cs, x3, mode, &result_c1);
  659.  
  660.     result->val  = (x2*(0.125 + result_c0.val) - result_c1.val) - 0.25;
  661.     result->err  = fabs(x2*result_c0.val) + result_c1.err;
  662.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  663.  
  664.     if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
  665.       /* scale only if x is positive */
  666.       double s = exp(2.0*x*sqrt(x)/3.0);
  667.       result->val *= s;
  668.       result->err *= s;
  669.     }
  670.  
  671.     return GSL_SUCCESS;
  672.   }
  673.   else if(x <= 4.0) {
  674.     const double sqrtx = sqrt(x);
  675.     const double z = (16.0/(x*sqrtx) - 9.0)/7.0;
  676.     const double s = sqrt(sqrtx);
  677.     gsl_sf_result result_c0;
  678.     cheb_eval_mode_e(&aip1_cs, z, mode, &result_c0);
  679.     result->val  = -(0.28125 + result_c0.val) * s;
  680.     result->err  = result_c0.err * s;
  681.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  682.     return GSL_SUCCESS;
  683.   }
  684.   else {
  685.     const double sqrtx = sqrt(x);
  686.     const double z = 16.0/(x*sqrtx) - 1.0;
  687.     const double s = sqrt(sqrtx);
  688.     gsl_sf_result result_c0;
  689.     cheb_eval_mode_e(&aip2_cs, z, mode, &result_c0);
  690.     result->val  = -(0.28125 + result_c0.val) * s;
  691.     result->err  = result_c0.err * s;
  692.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  693.     return GSL_SUCCESS;
  694.   }
  695. }
  696.  
  697.  
  698. int
  699. gsl_sf_airy_Ai_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
  700. {
  701.   /* CHECK_POINTER(result) */
  702.  
  703.   if(x < -1.0) {
  704.     gsl_sf_result a;
  705.     gsl_sf_result p;
  706.     int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
  707.     double c    = cos(p.val);
  708.     result->val  = a.val * c;
  709.     result->err  = fabs(result->val * p.err) + fabs(c * a.err);
  710.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  711.     return status_ap;
  712.   }
  713.   else if(x < 1.0) {
  714.     const double x3 = x*x*x;
  715.     gsl_sf_result result_c1;
  716.     gsl_sf_result result_c2;
  717.     cheb_eval_mode_e(&aif_cs, x3, mode, &result_c1);
  718.     cheb_eval_mode_e(&aig_cs, x3, mode, &result_c2);
  719.     result->val  = (x*x*(0.125 + result_c1.val) - result_c2.val) - 0.25;
  720.     result->err  = fabs(x*x*result_c1.err) + result_c2.err;
  721.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  722.     return GSL_SUCCESS;
  723.   }
  724.   else if(x*x*x < 9.0/4.0 * GSL_LOG_DBL_MIN*GSL_LOG_DBL_MIN) {
  725.     gsl_sf_result result_aps;
  726.     const double arg = -2.0*x*sqrt(x)/3.0;
  727.     const int stat_a = gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result_aps);
  728.     const int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
  729.                                                 result_aps.val, result_aps.err,
  730.                         result);
  731.     return GSL_ERROR_SELECT_2(stat_e, stat_a);
  732.   }
  733.   else {
  734.     UNDERFLOW_ERROR(result);
  735.   }
  736. }
  737.  
  738.  
  739. int
  740. gsl_sf_airy_Bi_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
  741. {
  742.   const double atr =  8.7506905708484345;   /* 16./(sqrt(8)-1) */
  743.   const double btr = -2.0938363213560543;   /* -(sqrt(8)+1)/(sqrt(8)-1) */
  744.  
  745.   /* CHECK_POINTER(result) */
  746.  
  747.   if(x < -1.0) {
  748.     gsl_sf_result a;
  749.     gsl_sf_result p;
  750.     int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
  751.     double s     = sin(p.val);
  752.     result->val  = a.val * s;
  753.     result->err  = fabs(result->val * p.err) + fabs(s * a.err);
  754.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  755.     return status_ap;
  756.   }
  757.   else if(x < 1.0) {
  758.     const double x3 = x*x*x;
  759.     const double x2 = x*x;
  760.     gsl_sf_result result_c1;
  761.     gsl_sf_result result_c2;
  762.     cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
  763.     cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
  764.     result->val  = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
  765.     result->err  = x2 * result_c1.err + result_c2.err;
  766.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  767.  
  768.     if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
  769.       /* scale only if x is positive */
  770.       const double s = exp(-2.0*x*sqrt(x)/3.0);
  771.       result->val *= s;
  772.       result->err *= s;
  773.     }
  774.  
  775.     return GSL_SUCCESS;
  776.   }
  777.   else if(x < 2.0) {
  778.     const double z = (2.0*x*x*x - 9.0) / 7.0;
  779.     const double s = exp(-2.0*x*sqrt(x)/3.0);
  780.     gsl_sf_result result_c0;
  781.     gsl_sf_result result_c1;
  782.     cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);
  783.     cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);
  784.     result->val  = s * (x*x * (0.25 + result_c0.val) + 0.5 + result_c1.val);
  785.     result->err  = s * (x*x * result_c0.err + result_c1.err);
  786.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  787.     return GSL_SUCCESS;
  788.   }
  789.   else if(x < 4.0) {
  790.     const double sqrtx = sqrt(x);
  791.     const double z = atr/(x*sqrtx) + btr;
  792.     const double s = sqrt(sqrtx);
  793.     gsl_sf_result result_c0;
  794.     cheb_eval_mode_e(&bip1_cs, z, mode, &result_c0);
  795.     result->val  = s * (0.625 + result_c0.val);
  796.     result->err  = s * result_c0.err;
  797.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  798.     return GSL_SUCCESS;
  799.   }
  800.   else {
  801.     const double sqrtx = sqrt(x);
  802.     const double z = 16.0/(x*sqrtx) - 1.0;
  803.     const double s = sqrt(sqrtx);
  804.     gsl_sf_result result_c0;
  805.     cheb_eval_mode_e(&bip2_cs, z, mode, &result_c0);
  806.     result->val  = s * (0.625 + result_c0.val);
  807.     result->err  = s * result_c0.err;
  808.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  809.     return GSL_SUCCESS;
  810.   }
  811. }
  812.  
  813.  
  814. int
  815. gsl_sf_airy_Bi_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
  816. {
  817.   /* CHECK_POINTER(result) */
  818.  
  819.   if(x < -1.0) {
  820.     gsl_sf_result a;
  821.     gsl_sf_result p;
  822.     int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
  823.     double s    = sin(p.val);
  824.     result->val  = a.val * s;
  825.     result->err  = fabs(result->val * p.err) + fabs(s * a.err);
  826.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  827.     return status_ap;
  828.   }
  829.   else if(x < 1.0) {
  830.     const double x3 = x*x*x;
  831.     const double x2 = x*x;
  832.     gsl_sf_result result_c1;
  833.     gsl_sf_result result_c2;
  834.     cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
  835.     cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
  836.     result->val  = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
  837.     result->err  = x2 * result_c1.err + result_c2.err;
  838.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  839.     return GSL_SUCCESS;
  840.   }
  841.   else if(x < 2.0) {
  842.     const double z = (2.0*x*x*x - 9.0) / 7.0;
  843.     gsl_sf_result result_c1;
  844.     gsl_sf_result result_c2;
  845.     cheb_eval_mode_e(&bif2_cs, z, mode, &result_c1);
  846.     cheb_eval_mode_e(&big2_cs, z, mode, &result_c2);
  847.     result->val  = x*x * (result_c1.val + 0.25) + result_c2.val + 0.5;
  848.     result->err  = x*x * result_c1.err + result_c2.err;
  849.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  850.     return GSL_SUCCESS;
  851.   }
  852.   else if(x < GSL_ROOT3_DBL_MAX*GSL_ROOT3_DBL_MAX) {
  853.     gsl_sf_result result_bps;
  854.     const double arg = 2.0*(x*sqrt(x)/3.0);
  855.     int stat_b = gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result_bps);
  856.     int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
  857.                                           result_bps.val, result_bps.err,
  858.                           result);
  859.     return GSL_ERROR_SELECT_2(stat_e, stat_b);
  860.   }
  861.   else {
  862.     OVERFLOW_ERROR(result);
  863.   }
  864. }
  865.  
  866. /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
  867.  
  868. #include "eval.h"
  869.  
  870. double gsl_sf_airy_Ai_deriv_scaled(const double x, gsl_mode_t mode)
  871. {
  872.   EVAL_RESULT(gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result));
  873. }
  874.  
  875. double gsl_sf_airy_Ai_deriv(const double x, gsl_mode_t mode)
  876. {
  877.   EVAL_RESULT(gsl_sf_airy_Ai_deriv_e(x, mode, &result));
  878. }
  879.  
  880. double gsl_sf_airy_Bi_deriv_scaled(const double x, gsl_mode_t mode)
  881. {
  882.   EVAL_RESULT(gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result));
  883. }
  884.  
  885. double gsl_sf_airy_Bi_deriv(const double x, gsl_mode_t mode)
  886. {
  887.   EVAL_RESULT(gsl_sf_airy_Bi_deriv_e(x, mode, &result));
  888. }
  889.